use std::ops::Add;

#[derive(Debug, Clone, Copy)]
struct Name<'a> {
    name: &'a str
}

impl<'a> Add for Name<'a> {
    type Output = Name<'a>; // 注意返回类型变为 'static 生命周期
    fn add(self, other: Self) ->Self {
        // 创建一个新的String
        let tmp = format!("{} {}", self.name, other.name);
        
        // 1. into_boxed_str() 将 String 转换为 Box<str>
        // 2. Box::leak 将 Box<str> "泄漏"，返回 &'static str
        // 这样做的目的是让返回的引用具有 'static 生命周期，不受函数作用域限制
        let leaked_str: &'static str = Box::leak(tmp.into_boxed_str());
        Self { name: leaked_str }
    }
}

fn main() {
    let name1 = Name { name: "lu" };
    let name2 = Name { name: "mula" };
    
    // 使用 + 运算符调用 add 方法
    let name3 = name1 + name2;
    
    // 由于实现了Copy，原始变量仍然可用
    println!("name1={:?}, name2={:?}", name1, name2);
    println!("name3={:?}", name3);
    
    // 内存泄漏演示：每次调用都会泄漏内存
    for i in 0..3 {
        let tmp = &i.to_string()[0..];
        let new_name = Name { name: "test" } + Name { name: tmp };
        println!("new_name={:?}", new_name);
        // 这里泄漏的内存直到程序结束才会释放
    }
}